/*
 * @lc app=leetcode.cn id=131 lang=cpp
 *
 * [131] 分割回文串
 */

// @lc code=start
class Solution
{
private:
    vector<string> path;        // 保存现有回文子串
    vector<vector<string>> res; // 保存最后结果
    bool isbackstring(string s, int start, int end)
    {
        // 判断是否是回文子串
        // 区间坚持左闭右开 但是为了判断方便 这里将end-1
        end--; //修改成左闭右闭区间
        // 双指针判断是否相等 如果是奇数 没必要判断中间那个数
        for (int i = start, j = end; i < j; i++, j--)
        {
            if (s[i] != s[j])
            {
                return false;
            }
        }
        return true;
    }
    void backtracking(const string &s, int index)
    {
        //返回条件 分割位置到了字符串末尾
        //区间 左闭右开
        if (index >= s.size())
        {
            res.push_back(path);
            return;
        }
        //for循环是层间遍历 递归是从上往下遍历
        //
        for (int i = index; i < s.size(); i++)
        {
            if (isbackstring(s, index, i + 1))
            {
                //判断[index,i]区间是否是回文串
                path.push_back(s.substr(index, i - index + 1));
            }
            else
            {
                continue;
            }
            backtracking(s, i + 1);
            path.pop_back();
        }
    }

public:
    vector<vector<string>> partition(string s)
    {
        backtracking(s, 0);
        return res;
    }
};
// @lc code=end

